#coding:utf-8

from flask import Flask
app = Flask(__name__,)



#内置转化器使用
#当需要匹配全部的int整形时,可以用int,规则就是<int:名字>
#定义好的名字,需要在视图函数的接收参数中也定义相同的形参
@app.route('/user/<int:id>') #id为自定义名字
def login(id):   #接收id
    return '%s' % id




#自定义万能转换器共3步

#这里的werkzeug路由模块就是flask的核心
from werkzeug.routing import BaseConverter
from flask import url_for,redirect

# 1 重写父类,下面的所有方法都是父类的方法
class RegexConverter(BaseConverter):
    def __init__(self, url_map, regex):
        #todo url_map是父级init接收的参数,规定好的
        super(RegexConverter, self).__init__(url_map)
        #todo regex为自己定义的
        #todo 将正则表达式的参数保存到对象的属性中,flask会去使用这个属性来进行正则匹配
        self.regex = regex

    def to_python(self, value):
        print('to_python方法被调用')
        return value
    def to_url(self, value):
        print('to_url方法被调用')
        return value

# 2. 将自定义的转换器添加到flask的应用中
app.url_map.converters['re'] = RegexConverter
#当用RegexConverter的时候,就可以直接用re简化了

# 3. 使用正则匹配
#todo 这里的<>还是跟内置转换器使用规则一致
#todo 其中的re(),这个为一个实例对象,里面的参数为正则匹配
@app.route("/send/<re(r'1[34578]\d{9}'):mobile_num>")  #todo 这里会自动执行to_python
def send_sms(mobile_num):
    return '我给 %s 发送信息' % mobile_num.encode('utf-8')  #注意这里的编码

@app.route('/')
def index():
    url = url_for('send_sms', mobile_num='13812345678')#todo 这里会调用to_url方法
    return redirect(url)  #重定向到url

if __name__ == '__main__':
    app.run(debug=True)